Video Coming Soon
• A soon to be released horror survival shooter, where the player has to fight off floors full of zombies while being trapped in an elevator.
• It features multiple guns and power-ups to aid the player, as well as, a plethora of distractions and mini-games/tasks which prevent the player from concentrating on the oncoming gang of zombies.
• I have implemented the entire programming end of the project using Unity Engine and C#, with design and art being the responsibility of a colleague (Jeremy Varcl). We also teamed up with some game testers to ensure the game is polished and bug-free.
• This project started as a game jam submission, but then quickly evolved into a release focused game as we (me and jeremy) liked the elevator-bound-survival game idea.
• It also serves the purpose of sharpening my team development and leadership skills, and it has also introduced me to the process of formally releasing a game.
• Implemented player behaviour, movement, shooting, and environment interaction.
• Programmed audio, dialogue, and subtitles components and made sure they are properly in-sync with the gameplay.
• Created enemy AI, main game loop, player power-ups, abilities, distractions, and setup animations when needed.
• Designed and implemented VFX using Unity's particle systems.
• Programmed and designed the UI.
• Created a leaderboard system to track player scores and promote competition, using Unity's leaderboard services.
• Acted as a de-facto producer and team lead, managing the project timeline, tasks, and team communication.
void Update()
{
var mousePos = Input.mousePosition;
mousePos.z = Camera.main.nearClipPlane;
Ray ray = Camera.main.ScreenPointToRay(mousePos);
RaycastHit hit;
if (Input.GetKey(KeyCode.Mouse0))
isPressed = true;
else if (Input.GetKeyUp(KeyCode.Mouse0))
isPressed = false;
if (Physics.Raycast(ray, out hit) && isPressed)
{
if (hit.transform.CompareTag("CameraOverlay"))
{
var mask = Instantiate(spriteMaskPrefab, hit.point, Quaternion.identity);
mask.transform.SetParent(steam, true);
mask.transform.localPosition = new Vector3(mask.transform.localPosition.x, mask.transform.localPosition.y, -0.2f);
mask.transform.rotation = steam.rotation;
masks.Add(mask);
if (CheckCleared())
{
wiped = true;
foreach(var maskItem in masks)
{
maskItem.GetComponent<BoxCollider>().enabled = false;
Destroy(maskItem, 3);
}
}
}
}
}
bool CheckCleared()
{
clearedArea = 0;
foreach (var mask in masks)
{
if (mask != null && mask.TryGetComponent<BoxCollider>(out var maskCollider))
clearedArea += maskCollider.bounds.size.x * maskCollider.bounds.size.y;
}
ratio = clearedArea / steamArea;
return ratio >= clearThreshold;
}
Full Script (GitHub)